/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Utils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.*;


/**
 *
 * @author Daniel
 * Questa classe contiene tutte le funzioni che riguardano lo studente;
 *
 */


/*
 * Author = DANIEL
 * 
 * @param = nome -> per il momento usiamo nome , poi useremo l'id primario che ricaveremo ddalla pagina di login
 * @return Studente complessivo di studyplan
 */
public class Query_Studente {
    
    private static HashMap studenti; 
    
    public static boolean aggiungi_corso_plan_database(User user , CorsoPlan corso)
            {
               int x = 0;
               
               int id = Integer.parseInt(((Studente)studenti.get(user.getName())).getMatricola());
               
                  Calendar cal = Calendar.getInstance();
                  java.util.Date date = cal.getTime();
                  java.sql.Date sqlDate = new java.sql.Date(date.getTime());
               
               String query = 
               "INSERT INTO course_enrollments (qualification , is_finished , credits , enrolled_at , updated_at , course , student , approved_at)" 
               + " VALUES (none , 0 , "+corso.getCrediti()+" , "+sqlDate+" , null , " + corso.getId() + " , " + id + " , null  ))";
               
               try 
                 {
                 Connection con = DBconnection.getConnection();
                 Statement stmt = con.createStatement(); 
                   
                  //x = stmt.executeUpdate(query);
                  }catch (Exception e){e.printStackTrace();return false;}
                
                if(x != 1)
                    return false;
                else
                    return true;
            }
   
    public static boolean rimuovi_corso_plan_database(User user , int corso)
            {
               int x = 0;
               
               int id = Integer.parseInt(((Studente)studenti.get(user.getName())).getMatricola());
               
               try 
                 {
                 Connection con = DBconnection.getConnection();
                 Statement stmt = con.createStatement(); 
                
                  //x = stmt.executeUpdate(DELETE FROM course_enrollments WHERE course = corso and student = id);
                  }catch (Exception e){e.printStackTrace();return false;}
                
                if(x != 1)
                    return false;
                else
                    return true;
            }
    
    public static boolean autocertifica_voto_database(User user , int corso , String voto)
            {
              int x = 0;
               
               int id = Integer.parseInt(((Studente)studenti.get(user.getName())).getMatricola());
               
               try 
                 {
                 Connection con = DBconnection.getConnection();
                 Statement stmt = con.createStatement(); 
                
                  //x = stmt.executeUpdate(update course_enrollments set qualification = voto where student = id and course = corso );
                  }catch (Exception e){e.printStackTrace();return false;}
                
                if(x != 1)
                    return false;
                else
                    return true;         
            }
    
    public static Object query_dati_studente(int id , String nome){
        
        if(studenti==null){
            studenti = new HashMap(250);  
        }
        if(studenti.containsKey(nome)){
            return studenti.get(nome);
        }
        
       Studente x = new Studente();
       String query = "Select * "
               + " from students s left join supervisors adv on s.current_advisor = adv.supervisor_ID "
               + "where s.user_ID = "+id+"  " 
               + "order by s.first_name ";  

       try 
       {
       Connection con = DBconnection.getConnection();
       Statement stmt = con.createStatement();
       ResultSet rs = stmt.executeQuery(query);
       
       String ID ="-1" ;
       while (rs.next()) { //Viene ritornato solo uno studente
            ID = rs.getString("s.user_ID");
            x.setMatricola(rs.getString("s.user_ID"));
            x.setNome(rs.getString("s.first_name"));
            x.setCognome(rs.getString("s.last_name"));
            x.setAnno(rs.getInt("course_year"));
            x.setResidenza(rs.getString("s.legal_residence"));
            x.setDomicilio(rs.getString("s.current_domicile"));
            x.setData_nascita(rs.getString("s.date_of_birth"));
            x.setLuogo_nascita(rs.getString("s.place_of_birth"));
            x.setNumero_ufficio(rs.getString("s.office_phone"));
            x.setNumero_cellulare(rs.getString("s.mobile_phone"));
            x.setEmail(rs.getString("s.email"));     
            x.setAdv_nome(rs.getString("adv.first_name"));
            x.setAdv_cognome(rs.getString("adv.last_name"));
            x.setAdv_email(rs.getString("adv.email")); 
            } 
       
            String query2 = "Select * "
               + "from (((Select qualification , is_finished , course , student , approved_at , updated_at "
               + "from courses_enrollments "
               + "where student = "+Integer.parseInt(ID)+" ) en left join  "
               + "(SELECT course_ID , credits , course_name , academic_year , is_in_manifesto , is_by_UNITN , planned_course_period , url , professor "
               + " from courses ) c on en.course = c.course_ID ) left join "
               + "(Select supervisor_ID , first_name , last_name , email "
               + "from supervisors ) s on professor = s.supervisor_ID) "
               + "order by academic_year";

            rs = stmt.executeQuery(query2);
            
            StudyPlan primo = null;
            StudyPlan secondo = null;
            StudyPlan terzo = null;
            
            CorsoPlan corso_plan ;
            
            /*Essendo la query ordinata per academic year il primo anno
             che trovo è quello ultimo e per capire se è il terzo/secondo/primo uso la varabile
             controllo che è ricavata da studente */
            
            int anno_prec = -1;
            int anno_cur;
            int ID_corso;
            int count_anni = 0;
            String crediti;
            
            
            while(rs.next())
               { 
               anno_cur = Integer.parseInt(rs.getString("academic_year"));
               if(anno_cur != anno_prec)
                   {
                      anno_prec = anno_cur;
                      switch(count_anni)
                        {
                        case 2 :  terzo = new StudyPlan(anno_cur);  
                                  count_anni++;
                                  break;
                        case 1 :  secondo = new StudyPlan(anno_cur);  
                                  count_anni++;
                                  break;
                        case 0 :  primo = new StudyPlan(anno_cur);  
                                  count_anni++;
                                  break;
                        default : break;  
                        }                      
                   }
                corso_plan = new CorsoPlan();
                corso_plan.setNome_docente(rs.getString("first_name"));
                corso_plan.setCognome_docente(rs.getString("last_name"));
                corso_plan.setUrl(rs.getString("url"));
                corso_plan.setEmail(rs.getString("email"));
                corso_plan.setNome(rs.getString("course_name"));
                corso_plan.setPeriodo(rs.getString("planned_course_period"));
                corso_plan.setVoto(rs.getString("qualification"));
                corso_plan.setEsterno(!rs.getBoolean("is_by_UNITN"));
                corso_plan.setCompletato(rs.getBoolean("is_finished"));
                corso_plan.setData_esame(rs.getString("updated_at"));
                boolean app = false;  
                if(rs.getString("approved_at") != null)
                    app = true;    
                corso_plan.setApprovato(app);
                
                
                crediti = rs.getString("credits");
                if(crediti != null)
                   corso_plan.setCrediti(Integer.parseInt(crediti));

                ID_corso = rs.getInt("course_ID");
                corso_plan.setId(ID_corso);
                

                        switch(count_anni)
                        {
                        case 3 :  terzo.aggiungiCorso(ID_corso , corso_plan); 
                                  break;
                        case 2 :  secondo.aggiungiCorso(ID_corso , corso_plan);  
                                  break;
                        case 1 :  primo.aggiungiCorso(ID_corso, corso_plan);
                                  break;
                        default : break;  
                        }           
               }
               if(primo == null)
                   primo = new StudyPlan(Calendar.getInstance().get(Calendar.YEAR));
               if(secondo == null)
                   secondo = new StudyPlan(primo.getAnno()+1);
               if(terzo == null)
                   terzo = new StudyPlan(primo.getAnno()+2);
               
               
               
               if(x.getAnno() == 1)
                   primo.setModificabile(true);
               else
               if(x.getAnno() == 2)
                   secondo.setModificabile(true);
               else
               if(x.getAnno() == 3)
                   terzo.setModificabile(true);
               else
                   primo.setModificabile(true);
               
               x.setPlan_anno1(primo);
               x.setPlan_anno2(secondo);
               x.setPlan_anno3(terzo);
   
            con.close();
       }
       catch(Exception ex){
           
           ex.printStackTrace();
           
       }
       studenti.put(nome, x);
     return x;
    
}
        public static void delete(String user)
                {  
                    if(studenti != null)
                        if(studenti.containsKey(user))
                            studenti.remove(user);
                }
    
    
       /*
         * Author = DANIEL
         * 
         * @param nomi_studenti = Lista di nomi (che poi diventeranno attributi primari (vedi sopra))
         * 
         * @return result = Lista di Studente
         * 
         * RICORDATEVI DI INSERIRLA NELLA HASH TABLE DELLA CLASSE INTERESSATA
         * AD ESEMPIO SE FATE UNA QUERY DA QUERY_ADVISOR INSERITELA POI
         * NELLA TABELLA DELLA PAGINA QUERY_ADVISOR 
         * QUESTA FUNZIONE RITORNA SOLO LA LISTA , NON FA OPERAZIONI DI MEMORIZZAZIONE
        */
    
       public static List <Studente> query_lista_studenti(List <Integer> id_studenti){
       
       Iterator iter = id_studenti.iterator();
       
       ArrayList <Studente> result = new ArrayList <Studente> (30); 
       
       int id_studente;
      
       try 
       {
       Connection con = DBconnection.getConnection();
       Statement stmt = con.createStatement();
       
      
       while(iter.hasNext())
       {
           
       id_studente = (Integer) iter.next();    
           
       Studente x = new Studente();
       String query = "Select * "
               + " from students s left join supervisors adv on s.current_advisor = adv.supervisor_ID "
               + "where s.user_ID = "+id_studente+" "
               + "order by s.first_name ";  

       ResultSet rs = stmt.executeQuery(query);
       
       String ID ="-1" ;
       while (rs.next()) { //Viene ritornato solo uno studente
            ID = rs.getString("s.user_ID");
            x.setMatricola(rs.getString("s.user_ID"));
            x.setNome(rs.getString("s.first_name"));
            x.setCognome(rs.getString("s.last_name"));     
            x.setAnno(rs.getInt("course_year"));
            x.setResidenza(rs.getString("s.legal_residence"));
            x.setDomicilio(rs.getString("s.current_domicile"));
            x.setData_nascita(rs.getString("s.date_of_birth"));
            x.setLuogo_nascita(rs.getString("s.place_of_birth"));
            x.setNumero_ufficio(rs.getString("s.office_phone"));
            x.setNumero_cellulare(rs.getString("s.mobile_phone"));
            x.setEmail(rs.getString("s.email"));     
            x.setAdv_nome(rs.getString("adv.first_name"));
            x.setAdv_cognome(rs.getString("adv.last_name"));
            x.setAdv_email(rs.getString("adv.email")); 
            x.setAmmesso_condizione(rs.getBoolean("admitted_conditionally"));
            } 
       
            String query2 = "Select * "
               + "from (((Select qualification , is_finished , course , student,approved_at "
               + "from courses_enrollments "
               + "where student = "+Integer.parseInt(ID)+" ) en left join  "
               + "(SELECT course_ID , credits , course_name , academic_year , is_in_manifesto , is_by_UNITN , planned_course_period , url , professor "
               + " from courses ) c on en.course = c.course_ID ) left join "
               + "(Select supervisor_ID , first_name , last_name , email "
               + "from supervisors ) s on professor = s.supervisor_ID) "
               + "order by academic_year";

            rs = stmt.executeQuery(query2);
            
            StudyPlan primo = null;
            StudyPlan secondo = null;
            StudyPlan terzo = null;
            
            CorsoPlan corso_plan ;
            
            /*Essendo la query ordinata per academic year il primo anno
             che trovo è quello ultimo e per capire se è il terzo/secondo/primo uso la varabile
             controllo che è ricavata da studente */
            
            int anno_prec = -1;
            int anno_cur;
            int ID_corso;
            int count_anni = 0;
            String crediti;
            
            
            while(rs.next())
               { 
               anno_cur = Integer.parseInt(rs.getString("academic_year"));
               if(anno_cur != anno_prec)
                   {
                      anno_prec = anno_cur;
                      switch(count_anni)
                        {
                        case 2 :  terzo = new StudyPlan(anno_cur);  
                                  count_anni++;
                                  break;
                        case 1 :  secondo = new StudyPlan(anno_cur);  
                                  count_anni++;
                                  break;
                        case 0 :  primo = new StudyPlan(anno_cur);  
                                  count_anni++;
                                  break;
                        default : break;  
                        }                      
                   }
                corso_plan = new CorsoPlan();
                corso_plan.setNome_docente(rs.getString("first_name"));
                corso_plan.setCognome_docente(rs.getString("last_name"));
                corso_plan.setUrl(rs.getString("url"));
                corso_plan.setEmail(rs.getString("email"));
                corso_plan.setNome(rs.getString("course_name"));
                corso_plan.setPeriodo(rs.getString("planned_course_period"));
                crediti = rs.getString("credits");
                if(crediti != null)
                   corso_plan.setCrediti(Integer.parseInt(crediti));
                
                if(rs.getString("approved_at")==null)    
                    corso_plan.setApprovato(false);
                else
                    corso_plan.setApprovato(true);
                
                corso_plan.setVoto(rs.getString("qualification"));
                
                
                ID_corso = rs.getInt("course_ID");
                corso_plan.setId(ID_corso);
                
                corso_plan.setEsterno(!rs.getBoolean("is_by_UNITN"));
                corso_plan.setCompletato(rs.getBoolean("is_finished"));
                
                        switch(count_anni)
                        {
                        case 3 :  terzo.aggiungiCorso(ID_corso , corso_plan); 
                                  break;
                        case 2 :  secondo.aggiungiCorso(ID_corso , corso_plan);  
                                  break;
                        case 1 :  primo.aggiungiCorso(ID_corso, corso_plan);
                                  break;
                        default : break;  
                        }           
               }
               if(primo == null)
                   primo = new StudyPlan(Calendar.getInstance().get(Calendar.YEAR));
               if(secondo == null)
                   secondo = new StudyPlan(primo.getAnno()+1);
               if(terzo == null)
                   terzo = new StudyPlan(primo.getAnno()+2);
               
               x.setPlan_anno1(primo);
               x.setPlan_anno2(secondo);
               x.setPlan_anno3(terzo);
   
         result.add(x);
         
         } //while close
       con.close();
       } // try close
       catch(Exception ex){ex.printStackTrace();}
     
    return result;
    
} 

 public static List <Studente> query_lista_studenti_segreteria(String nome , String id , String cognome , String advisor){
       
       
       ArrayList <Studente> result = new ArrayList <Studente> (100); 
             
       if(nome==null)
           nome = "";
       if(id==null)
           id = "";
       if(cognome==null)
           cognome = "";
       if(advisor==null)
           advisor = "";
       
       try 
       {
       Connection con = DBconnection.getConnection();
       Statement stmt = con.createStatement();
          
       String query = "Select * "
               + " from students s left join supervisors adv on s.current_advisor = adv.supervisor_ID "
               + "where s.first_name like '"+nome+"%' AND s.last_name like '"+cognome+"%' AND s.user_ID like '"+id+"%' AND adv.last_name like '"+advisor+"%' "
               + "order by s.first_name ";  

       ResultSet rs = stmt.executeQuery(query);
       
       int ID = -1;
       Studente x = null;
       
       while (rs.next()) { //Viene ritornato solo uno studente
            x = new Studente();
            ID = rs.getInt("s.user_ID");
            x.setMatricola(rs.getString("s.user_ID"));
            x.setNome(rs.getString("s.first_name"));
            x.setCognome(rs.getString("s.last_name"));     
            x.setAnno(rs.getInt("course_year"));
            x.setResidenza(rs.getString("s.legal_residence"));
            x.setDomicilio(rs.getString("s.current_domicile"));
            x.setData_nascita(rs.getString("s.date_of_birth"));
            x.setLuogo_nascita(rs.getString("s.place_of_birth"));
            x.setNumero_ufficio(rs.getString("s.office_phone"));
            x.setNumero_cellulare(rs.getString("s.mobile_phone"));
            x.setEmail(rs.getString("s.email"));     
            x.setAdv_nome(rs.getString("adv.first_name"));
            x.setAdv_cognome(rs.getString("adv.last_name"));
            x.setAdv_email(rs.getString("adv.email"));  
       
            String query2 = "Select * "
               + "from (((Select qualification , is_finished , course , student, approved_at "
               + "from courses_enrollments "
               + "where student = "+ID+" ) en left join  "
               + "(SELECT course_ID , credits , course_name , academic_year , is_in_manifesto , is_by_UNITN , planned_course_period , url , professor "
               + " from courses ) c on en.course = c.course_ID ) left join "
               + "(Select supervisor_ID , first_name , last_name , email "
               + "from supervisors ) s on professor = s.supervisor_ID) "
               + "order by academic_year";
            Statement stmt2 = con.createStatement();
            ResultSet rs2 = stmt2.executeQuery(query2);
            
            StudyPlan primo = null;
            StudyPlan secondo = null;
            StudyPlan terzo = null;
            
            CorsoPlan corso_plan ;
            
            /*Essendo la query ordinata per academic year il primo anno
             che trovo è quello ultimo e per capire se è il terzo/secondo/primo uso la varabile
             controllo che è ricavata da studente */
            
            int anno_prec = -1;
            int anno_cur;
            int ID_corso;
            int count_anni = 0;
            String crediti;
            
            
            while(rs2.next())
               { 
               anno_cur = Integer.parseInt(rs2.getString("academic_year"));
               if(anno_cur != anno_prec)
                   {
                      anno_prec = anno_cur;
                      switch(count_anni)
                        {
                        case 2 :  terzo = new StudyPlan(anno_cur);  
                                  count_anni++;
                                  break;
                        case 1 :  secondo = new StudyPlan(anno_cur);  
                                  count_anni++;
                                  break;
                        case 0 :  primo = new StudyPlan(anno_cur);  
                                  count_anni++;
                                  break;
                        default : break;  
                        }                      
                   }
                corso_plan = new CorsoPlan();
                corso_plan.setNome_docente(rs2.getString("first_name"));
                corso_plan.setCognome_docente(rs2.getString("last_name"));
                corso_plan.setUrl(rs2.getString("url"));
                corso_plan.setEmail(rs2.getString("email"));
                corso_plan.setNome(rs2.getString("course_name"));
                corso_plan.setPeriodo(rs2.getString("planned_course_period"));
                crediti = rs2.getString("credits");
                if(crediti != null)
                   corso_plan.setCrediti(Integer.parseInt(crediti));
                
                if(rs2.getString("en.approved_at")==null)    
                    corso_plan.setApprovato(false);
                else
                    corso_plan.setApprovato(true);
                
                corso_plan.setVoto(rs2.getString("en.qualification"));
                
                ID_corso = rs2.getInt("course_ID");
                corso_plan.setId(ID_corso);
                
                corso_plan.setEsterno(!rs2.getBoolean("is_by_UNITN"));
                corso_plan.setCompletato(rs2.getBoolean("is_finished"));
                
                        switch(count_anni)
                        {
                        case 3 :  terzo.aggiungiCorso(ID_corso , corso_plan); 
                                  break;
                        case 2 :  secondo.aggiungiCorso(ID_corso , corso_plan);  
                                  break;
                        case 1 :  primo.aggiungiCorso(ID_corso, corso_plan);
                                  break;
                        default : break;  
                        }           
               }
               if(primo == null)
                   primo = new StudyPlan(Calendar.getInstance().get(Calendar.YEAR));
               if(secondo == null)
                   secondo = new StudyPlan(primo.getAnno()+1);
               if(terzo == null)
                   terzo = new StudyPlan(primo.getAnno()+2);
               
               x.setPlan_anno1(primo);
               x.setPlan_anno2(secondo);
               x.setPlan_anno3(terzo);
   
         result.add(x);
       }

       con.close();
       } // try close
       catch(Exception ex){ex.printStackTrace();}
     
    return result;
    
}       
       
       
       
       
       
       
}

